#ifndef ELEMENTARY_OPERATOR_HPP
#define ELEMENTARY_OPERATOR_HPP

#include <memory>

#include <string>

class ElementaryOperator;
class IdentityOperator;
class KetBra;

typedef std::auto_ptr<ElementaryOperator> ElementaryOperatorP;

class ElementaryOperator {
	public:
    ElementaryOperator() {};
		virtual std::string show() const = 0;
		virtual ~ElementaryOperator() {};
		virtual  ElementaryOperatorP matMul(
        const ElementaryOperator& other) const = 0;
    virtual ElementaryOperatorP concreteMatMul(const KetBra& left) const = 0;
    virtual ElementaryOperatorP concreteMatMul(const IdentityOperator& left) const = 0;
};

#endif
